#wpf #data-binding #user-controls #dependency-properties
#wpf #привязка данных #пользовательские элементы управления #зависимость-свойства
Вопрос:
У меня есть UserControl, который изложен следующим образом:
Сетка DeveloperExpress, привязанная к наблюдаемой коллекции, называемой Data:
public ObservableCollection<SummaryData> Data { get; set; }
Метка с содержимым, привязанным к случаям, которая является первым элементом сбора данных:
<Label FontStyle="Italic" Margin="2" Content="{Binding ElementName=CaseControlUC, Path=Cases.Exposed, TargetNullValue=IAmNull, Mode=OneWay}" />
где:
public SummaryData Cases { get; set; }
private void LoadExampleDataIntoSummaryGrid()
{
Cases = new SummaryData() { Caption = "Cases", Exposed = "A", Unexposed = "B" };
Data.Add(Cases);
Data.Add(new SummaryData() { Caption = "Controls", Exposed = "C", Unexposed = "D" });
}
И код для SummaryData:
public class SummaryData : DependencyObject
{
public string Caption { get; set; }
public static readonly DependencyProperty ExposedProperty = DependencyProperty.Register("ExposedValue",
typeof(string),
typeof(SummaryData),
new UIPropertyMetadata(null));
public string Exposed
{
get
{
return (string)GetValue(ExposedProperty);
}
set
{
SetValue(ExposedProperty, value);
}
}
public static readonly DependencyProperty UnexposedProperty = DependencyProperty.Register("UnexposedValue",
typeof(string),
typeof(SummaryData),
new UIPropertyMetadata(null));
public string Unexposed
{
get
{
return (string)GetValue(UnexposedProperty);
}
set
{
SetValue(UnexposedProperty, value);
}
}
public string Total
{
get
{
int exposed;
int unexposed;
if (Int32.TryParse(Exposed, out exposed) amp;amp; Int32.TryParse(Unexposed, out unexposed))
{
return (exposed unexposed).ToString();
}
return String.Format("{0} {1}", Exposed, Unexposed);
}
}
}
Обратите внимание, что «Exposed» и «Неэкспонированный» являются свойствами DependencyProperties для DependencyObject.
Моя проблема в том, что, когда я использую Grid для обновления объекта Cases (и я знаю, что он действительно обновляется с помощью отладчика), изменение не отражается на метке. Я проверил, и окно вывода не показывает ошибок привязки данных. Кроме того, если я вернусь к использованию в качестве обычного свойства, начальное значение считывается просто отлично (хотя обновления не отражаются, ofc.)
Я также попытался вставить конвертер в привязку данных (просто NOP-конвертер, который возвращает все, что ему задано), и он действительно никогда не вызывался…
Есть какие-нибудь подсказки? 🙂
Ответ №1:
В вашем Exposed
объявлении свойства зависимости вы неправильно указали имя свойства «ExposedValue», а не «Exposed».
Комментарии:
1. AFAIK строковый параметр — это просто произвольное текстовое имя свойства зависимости, и поэтому я могу называть его как угодно? Во всяком случае, я пытался изменить его, но, к сожалению, это не помогло.
2. У вас есть полный пример, доступный для загрузки, который воссоздает проблему? Обычно для типов моделей, таких как SummaryData, вы бы реализовали INotifyPropertyChanged, а не использовали свойства зависимостей, потому что это привязывает вас к WPF, и модель нельзя повторно использовать на других платформах.
3. Мне удалось заставить его работать час или около того назад — это был ПОЛНЫЙ мозговой штурм, и я смущен тем, что я опубликовал здесь для начала… Я создавал элемент, к которому я привязываю данные, после вызова InitializeComponent() в конструкторе моего UserControl, что означало, что я пытался привязать данные к null, и, конечно, когда я затем обновил значения после создания элемента, ну, привязка данных уже не удалась! Большое спасибо за вашу помощь, хотя!