[WPF DevExpress] GridControl์ด ํ์ ๊ฐ์ฒด ์์ฑ ๋ณ๊ฒฝ์ด UI์ ๋ฐ์๋์ง ์์ ๋ ํด๊ฒฐ๋ฐฉ๋ฒ
DevExpress์ GridControl
๊ณผ ํจ๊ป ์ฌ์ฉํ ๋, ํ์ ๊ฐ์ฒด์ ์์ฑ ๋ณ๊ฒฝ์ด UI์ ๋ฐ์๋์ง ์๋ ๋ฌธ์ ๋ฅผ ๊ฒช๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
GridControl์์ ์ค์ฒฉ ๊ฐ์ฒด์ ์์ฑ ๋ฐ์ธ๋ฉ์ ๋งค์ฐ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.Customer.Name
, Product.Category.Name
๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๋ฐ์ธ๋ฉํ ๋,
๊ฐ์ ์ ํ์๋์ง๋ง ๋ณ๊ฒฝ์ด ๋ฐ์๋์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
์ด๋ฒ ๊ธ์์๋ ๊ทธ ์ํฉ์ ์ฌํํด๋ณด๊ณ , ์ด๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ ๋ ๊ฐ์ง์ ๋ํด ์๊ฐํฉ๋๋ค.
์๋๋ฆฌ์ค
์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ด Order
์ Customer
ํด๋์ค๋ฅผ ํฌํจํ๋ ๊ตฌ์กฐ๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
UI์์ ๋ณ๊ฒฝ์ ๊ฐ์งํ ์ ์๋๋ก INotifyPropertyChanged๋ฅผ ์์๋ฐ๋ BindableData๋ ๋ง๋ค์์ต๋๋ค.
public class BindableData : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName) =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
protected bool SetProperty<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
{
if (EqualityComparer<T>.Default.Equals(field, value)) {
return false;
}
field = value;
OnPropertyChanged(propertyName);
return true;
}
}
public class Customer : BindableData
{
private string name;
public string Name
{
get => name;
set => SetProperty(ref name, value);
}
}
public class Order : BindableData
{
private int id;
public int Id
{
get => id;
set => SetProperty(ref id, value);
}
private Customer customer;
public Customer Customer
{
get => customer;
set => SetProperty(ref customer, value);
}
}
๊ทธ๋ฆฌ๊ณ ViewModel์์๋ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋จํ ์ฃผ๋ฌธ ๋ชฉ๋ก๊ณผ Customer Name์ ๋ณ๊ฒฝํ๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
public class MainViewModel
{
public virtual ObservableCollection<Order> Orders { get; set; }
public MainViewModel()
{
Orders = new ObservableCollection<Order>
{
new Order { Id = 1, Customer = new Customer { Name = "ํ๊ธธ๋" } },
new Order { Id = 2, Customer = new Customer { Name = "๊น์ฒ ์" } }
};
}
public void ChangeCustomerName(string newValue)
{
Orders[0].Customer.Name = newValue;
}
}
XAML ๊ตฌ์ฑ
GridControl์ ์ฌ์ฉํ์ฌ Order ๋ชฉ๋ก์ ๋ฐ์ธ๋ฉํฉ๋๋ค.
Customer์ ์ด๋ฆ๋ ์ปฌ๋ผ์ผ๋ก ํ์ํ๊ณ ์์ต๋๋ค:
<StackPanel>
<dxg:GridControl MaxHeight="1000" ItemsSource="{Binding Orders}">
<dxg:GridControl.Columns>
<dxg:GridColumn FieldName="Id" Header="์ฃผ๋ฌธ ๋ฒํธ"/>
<dxg:GridColumn FieldName="Customer.Name" Header="๊ณ ๊ฐ ์ด๋ฆ"/>
</dxg:GridControl.Columns>
</dxg:GridControl>
<Button Content="์ด๋ฆ ๋ณ๊ฒฝ" Height="20" Width="100" HorizontalAlignment="Left"
Click="Button_Click"/>
</StackPanel>

์์ํ ๋์
- ์ด๋ฆ ๋ณ๊ฒฝ ๋ฒํผ์ ํด๋ฆญํ๋ฉด
Customer.Name
์ ๊ฐ์ธ 'Hanav'๊ฐ '๋ณ๊ฒฝ ์๋ฃ!'๋ก ๋ณ๊ฒฝ๋์ดGridControl
์ ํด๋น ์ ๋ ํจ๊ป ๊ฐฑ์ ๋์ด์ผ ํฉ๋๋ค.
์ค์ ๋์
Customer.Name
์ด ๋ณ๊ฒฝ๋์ด๋ GridControl์ UI๋ฅผ ๊ฐฑ์ ํ์ง ์์ต๋๋ค.- ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ช ํ ๋ณ๊ฒฝํ์์๋, ์ ๋ด์ฉ์ด ๊ทธ๋๋ก ์ ์ง๋๋ ํ์์ด ๋ฐ์ํฉ๋๋ค.

ํด๊ฒฐ ๋ฐฉ๋ฒ 1 โ GridControl์ DetectNestedPropertyChanges ์ค์
์ด ๋ฌธ์ ๋ GridControl
์ ๋ค์๊ณผ ๊ฐ์ดDetectNestedPropertyChanges="True"
์์ฑ์ ์ถ๊ฐํ๋ฉด ํด๊ฒฐ๋ฉ๋๋ค.
<dxg:GridControl DetectNestedPropertyChanges="True">
...
</dxg:GridControl>
์ด ์์ฑ์ ์ค์ ํ๋ฉด GridControl
์ด ์ค์ฒฉ๋ ๊ฐ์ฒด์ PropertyChanged
์ด๋ฒคํธ๋ ์๋์ผ๋ก ๊ตฌ๋
ํ๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ผ์ Customer.Name
์ด ๋ณ๊ฒฝ๋๋ฉด ํด๋น ์
์ ๊ฐฑ์ ํ ์ ์๊ฒ ๋ฉ๋๋ค.

ํด๊ฒฐ ๋ฐฉ๋ฒ 2 - Binding={Binding Property, UpdateSourceTrigger=PropertyChanged}
GridColumn์ FieldName="Customer.Name" ๋์ Binding="{Binding ...}"์ ๋ช
์์ ์ผ๋ก ์ค์ ํ๋ฉด,
DevExpress๋ ๋ด๋ถ์ ์ผ๋ก WPF์ ํ์ค ๋ฐ์ธ๋ฉ ์์คํ
์ ๊ทธ๋๋ก ๋ฐ๋ฅด๊ฒ ๋ฉ๋๋ค.
์ฆ, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, Converter ๋ฑ์ ์ฌ์ฉํ ์ ์๊ฒ ๋ผ์.
<dxg:GridControl MaxHeight="1000" ItemsSource="{Binding Orders}">
<dxg:GridControl.Columns>
<dxg:GridColumn FieldName="Id" Header="์ฃผ๋ฌธ ๋ฒํธ"/>
<dxg:GridColumn Binding="{Binding Customer.Name, UpdateSourceTrigger=PropertyChanged}" Header="๊ณ ๊ฐ ์ด๋ฆ"/>
</dxg:GridControl.Columns>
</dxg:GridControl>
์ด ๋ฐ์ธ๋ฉ์ ์์ฑ์ด INotifyPropertyChanged๋ฅผ ๊ตฌํํ๊ณ ์๋ค๋ฉด
Customer.Name์ด ๋ณ๊ฒฝ๋ ๋ ์
๋ด์ฉ๋ ์ฆ์ ๊ฐฑ์ ๋ฉ๋๋ค.

์ ๋ฆฌ
ํญ๋ชฉ | ์ค๋ช |
---|---|
๋ฌธ์ | GridControl์ด ์ค์ฒฉ ์์ฑ(Customer.Name)์ ๋ณ๊ฒฝ์ ๊ฐ์งํ์ง ๋ชปํจ |
์์ธ | ๋ด๋ถ ๊ฐ์ฒด์ ๋ณ๊ฒฝ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ ์ถ์ ๋์ง ์์ |
ํด๊ฒฐ | 1. GridControl ์ DetectNestedPropertyChanges="True" ์ค์ |
2. Binding="{Binding ...}"์ ๋ช ์์ ์ผ๋ก ์ค์ |